﻿using System;

class SpecialValue
{
    static void Main()
    {
        int N = int.Parse(Console.ReadLine());
        int[][] field = new int[N][]; //jagged array - назъбен масив

        ReadData(field);

        bool[][] used = new bool[N][];

        for (int i = 0; i < N; i++)
        {
            used[i] = new bool[field[i].Length];
        }

        long max = long.MinValue;

        for (int i = 0; i < field[0].Length; i++)
        {
            long specialValue = FindCurrentSpecialValue(field, i, used);

            if (max < specialValue)
            {
                max = specialValue;
            }
        }
        Console.WriteLine(max);
    }

    static int[][] ReadData(int[][] field)
    {
        for (int i = 0; i < field.GetLength(0); i++)
        {
            string[] currentLine = Console.ReadLine().Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);

            field[i] = new int[currentLine.Length];
            for (int j = 0; j < currentLine.Length; j++)
            {
                field[i][j] = int.Parse(currentLine[j].ToString());  //field[i][j]  - така се записват назъбените масиви
            }
        }
        return field;
    }

    static long FindCurrentSpecialValue(int[][] field, int column, bool[][] used)
    {
        long result = 0;
        int currentRow = 0;
        while (true)
        {
            result++;
            if (used[currentRow][column])
            {
                return long.MinValue;
            }

            if (field[currentRow][column] < 0)
            {
                result = result - field[currentRow][column];  //за отрицателните стойности -(-) = +
                return result;
            }

            int nextColumn = field[currentRow][column];     //следващата колона е числото
            used[currentRow][column] = true;    //за да отбележим, че е посетено
            column = nextColumn;
            currentRow++;

            if (currentRow == field.GetLength(0))       //ако реда ни излезе от масива, трябва да се върне на първия ред
            {
                currentRow = 0;
            }
        }

        return result;
    }
}

